package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IInstitutionDAO;
import org.jsola.hr.dto.InstitutionAddDTO;
import org.jsola.hr.dto.InstitutionUpdateDTO;
import org.jsola.hr.entity.InstitutionDO;
import org.jsola.hr.query.InstitutionQuery;
import org.jsola.hr.vo.InstitutionListVO;
import org.jsola.hr.vo.InstitutionVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 制度
 *
 * @author zhr
 */
public interface IInstitutionService extends IService<IInstitutionDAO, InstitutionDO> {

    /**
     * 新增制度
     *
     * @param institutionAddDTO 新增制度DTO
     * @param tokenUser         当前用户
     * @return 制度详情信息
     */
    InstitutionVO save(InstitutionAddDTO institutionAddDTO, TokenUser tokenUser);

    /**
     * 修改制度
     *
     * @param institutionUpdateDTO 修改制度DTO
     * @param tokenUser            当前用户
     * @return 更新数量
     */
    int update(InstitutionUpdateDTO institutionUpdateDTO, TokenUser tokenUser);

    /**
     * 开启制度
     *
     * @param institutionId 制度id
     * @param tokenUser     当前用户
     * @return 更新数量
     */
    int openInstitution(String institutionId, TokenUser tokenUser);

    /**
     * 关闭制度
     *
     * @param institutionId 制度id
     * @param tokenUser     当前用户
     * @return 更新数量
     */
    int closeInstitution(String institutionId, TokenUser tokenUser);


    /**
     * 批量删除制度，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser      当前用户
     * @param institutionIds 制度id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... institutionIds);

    /**
     * 根据制度id查找
     *
     * @param institutionId 制度id
     * @param siteId        所属站点id
     * @return 制度详情信息
     */
    InstitutionVO selectById(String institutionId, String siteId);

    /**
     * 查询制度
     *
     * @param institutionQuery 查询条件
     * @param siteId           所属站点id
     * @return 制度列表信息
     */
    List<InstitutionListVO> select(InstitutionQuery institutionQuery, String siteId);

    /**
     * 查询制度记录数
     *
     * @param institutionQuery 查询条件
     * @param siteId           所属站点id
     * @return 制度记录数
     */
    int selectCount(InstitutionQuery institutionQuery, String siteId);

    /**
     * 分页查询制度
     *
     * @param institutionQuery 查询条件
     * @param siteId           所属站点id
     * @return 制度列表信息
     */
    Page<InstitutionListVO> selectPage(InstitutionQuery institutionQuery, String siteId);


    /**
     * 根据制度id查找
     *
     * @param institutionId 制度id
     * @param siteId        所属站点id
     * @return 制度
     */
    InstitutionDO selectDOById(String institutionId, String siteId);

    /**
     * 查询制度
     *
     * @param institutionQuery 查询条件
     * @param siteId           所属站点id
     * @return 制度列表
     */
    List<InstitutionDO> selectDO(InstitutionQuery institutionQuery, String siteId);

    /**
     * 查询制度分类下用工单位中的制度 开启关闭都查到
     *
     * @param institutionTypeId 制度分类id
     * @param companyId         用工单位Id
     * @param siteId            所属站点id
     * @return 制度列表
     */
    List<InstitutionDO> selectByTypeIdAndCompanyId(String institutionTypeId, String companyId, String siteId);

    /**
     * 查询制度分类下用工单位制度 开启关闭都查到
     *
     * @param institutionTypeIds 制度分类ids
     * @param companyId          用工单位Id
     * @param siteId             所属站点id
     * @return 制度列表
     */
    List<InstitutionDO> selectByTypeIdsAndCompanyId(List<String> institutionTypeIds, String companyId, String siteId);

    /**
     * 查询制度分类下制度 开启关闭都查到
     *
     * @param institutionTypeIds 制度分类ids
     * @param siteId             所属站点id
     * @return 制度列表
     */
    List<InstitutionDO> selectByTypeIds(List<String> institutionTypeIds, String siteId);

    /**
     * 查询用工单位开启的制度 员工端小程序使用
     *
     * @param companyId
     * @param siteId    所属站点id
     * @return 制度列表
     */
    List<InstitutionListVO> selectOpenByCompanyId(String companyId, String siteId);

    /**
     * 查询制度分类下制度(分页) 开启关闭都查到
     *
     * @param institutionTypeId 制度分类id
     * @param companyId         用工单位Id
     * @param pageNo
     * @param pageSize
     * @param siteId            所属站点id
     * @return 制度列表
     */
    Page<InstitutionDO> selectByTypeIdAndCompanyId(String institutionTypeId, String companyId, Integer pageNo, Integer pageSize, String siteId);

    /**
     * 查询制度
     *
     * @param companyId
     * @param title     制度标题
     * @param siteId    所属站点id
     * @return 制度列表
     */
    List<InstitutionDO> selectByCompanyIdAndTitle(String companyId, String title, String siteId);
}


